/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package tareas;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.PrintWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.util.StringTokenizer;


/**
 * Clase que procesa un archivo de texto y produce una salida en un
 * segundo archivo.
 * @author Rafael Carrillo 90465
 */
public class ProcesaTexto {
    private String archivoEntrada;
    private String archivoSalida;

    FileReader input=null;
    
    /**
     * Constructor que lee un archivo de tareas y las ejecuta
     * 
     * @param tareas Nombre del archivo de tareas
     */
    public ProcesaTexto(String tareas){
        abreArchivo(tareas);
        try{
            BufferedReader inputText=new BufferedReader(input);
            String instruccion="";
            while(true){
                instruccion=inputText.readLine();
                if(instruccion==null) break;  //No hay mas texto?  
                if(instruccion.equalsIgnoreCase("buscar")){
                    archivoEntrada=inputText.readLine();
                    archivoSalida=inputText.readLine();
                    String palabraBuscar=inputText.readLine();
                    String palabraReemplazar=inputText.readLine();
                    buscar(archivoEntrada, palabraBuscar, palabraReemplazar);
                }
                if(instruccion.equalsIgnoreCase("contar")){
                    archivoEntrada=inputText.readLine();
                    cuenta(archivoEntrada);
                }
                
            }
        }
        catch(IOException e){
            System.out.println("Error al procesar el archivo");
        }
    }
    /**
     * Cuenta las palabras , caracteres y lineas de un archivo
     */
    public final void cuenta(String archivoEntrada){
        abreArchivo(archivoEntrada);
        String linea="";
        int palabras=0;
        int caracteres=0;
        int lineas=0;
        try{
            BufferedReader inputText=new BufferedReader(input);
            String delimiters = "+-*/(),. ";
            while (true){
                linea=inputText.readLine();
                if (linea==null) break;
                //Cuenta las lineas
                lineas++;
                //Cuenta palabras en la linea
               // palabras+=linea.split("\\s").length; 
                StringTokenizer st = new StringTokenizer(linea,delimiters);
                palabras+=st.countTokens();
                //Cuentas los caracteres, eliminando primero los espacios
                caracteres+=linea.replaceAll("\\s*","").length();
            }
            input.close();
            inputText.close();
        }catch(IOException e){
            System.out.println(e.getMessage());
        }
        System.out.println("Lineas:\t\t"+lineas);
        System.out.println("Palabras:\t"+palabras);
        System.out.println("Caracteres:\t"+caracteres);       
    }
    /**
     * Busca la palabra dada por el parametro y la reemplaza por el segundo parametro
     * @param palabraBuscar Palabra a buscar
     * @param palabraReemplazo Palabra a reemplazar
     */
    public final void buscar(String archivoEntrada, String palabraBuscar,String palabraReemplazo){
        abreArchivo(archivoEntrada);
        String linea="";
        StringBuffer buffer=new StringBuffer(); //Buffer para escribir en el archivo
        int n=0;//Coincidencias
        int pos=0; // posicion
        //Se va a hacer la busqueda y si existen resultados se hace el reemplazo
        try{
            BufferedReader inputText=new BufferedReader(input);
            while (true){
                linea=inputText.readLine();
                if (linea==null) break;
                while(true){
                    pos=linea.indexOf(palabraBuscar, pos);
                    if (pos<=-1)break;
                    n++;
                    pos+=palabraBuscar.length();
                }
                if (n>0){
                    buffer.append(reemplaza(linea,palabraBuscar,palabraReemplazo));
                    buffer.append(System.getProperty("line.separator"));
                }
            }
            writeFile(archivoSalida, buffer);
            input.close();
            inputText.close();
        }
         catch(IOException e){
             System.out.println("Error al procesar el archivo");
         }
    }
    /**
     * Método que abre el archivo (unicamente de uso local)
     */
    private void abreArchivo(String archivo){
         try{
            input=new FileReader(archivo);
         }    
         catch (FileNotFoundException fnfe){
            System.out.println("Error al abrir el archivo "+archivoEntrada);
        }
        }
    /**
     * Método auxiliar que escribe la salida a un archivo.
     * 
     */
    private void writeFile(String file,StringBuffer buffer){
        try{
            
            BufferedWriter output =new BufferedWriter(new FileWriter(file));
            PrintWriter writer=new PrintWriter(output);
            writer.println(buffer);
            output.close();
            writer.close();
        }
        catch(IOException e){
            System.out.println("Error al escribir en el archivo "+file);
        }
    }
    
    /**
     * Metodo auxiliar que reemplaza una palabra por otra en la linea enviada
     * por los parametros
     * 
     */
    private String reemplaza(String linea,String palabraBuscar,String palabraReemplazo){
        String resultado=linea;
        resultado=linea.replace(palabraBuscar, palabraReemplazo);
        return resultado;
        }
   
}
    
